package univ.lille1.fr.car;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import univ.lille1.fr.car.ejb.Auteur;
import univ.lille1.fr.car.ejb.Livre;
import univ.lille1.fr.car.manager.AuteurManager;
import univ.lille1.fr.car.manager.LivreManager;


public class Init extends HttpServlet{
	private static final long serialVersionUID = 1L;
	
	protected LivreManager livreManager = new LivreManager();
	protected AuteurManager auteurManager = new AuteurManager();
	protected List<Livre> listeLivres = new ArrayList<Livre>();
	protected List<Auteur> listeAuteurs = new ArrayList<Auteur>();

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// déconnection
		if(request.getParameter("deco") != null){
			if(request.getParameter("deco").equals("true")){
				request.getSession().removeAttribute("username");
				this.getServletContext().getRequestDispatcher("/WEB-INF/connexion.jsp").forward(request, response);
				return;
			}
		}
		
		this.checkConnect(request, response);
		
		HttpSession session = request.getSession();
		
		if(session.getAttribute("username") == null){
			this.getServletContext().getRequestDispatcher("/WEB-INF/c.jsp").forward(request, response);
		}
		
		// initialisation de la DB
		this.listeAuteurs = Init.initDBAuteur(listeAuteurs, auteurManager);
		this.listeLivres = Init.initDBLivre(listeLivres, livreManager);
		
		request.setAttribute("listeLivres", listeLivres);
		request.setAttribute("listeAuteurs", listeAuteurs);
		
		request.setAttribute("username", session.getAttribute("username"));
		this.getServletContext().getRequestDispatcher("/WEB-INF/init.jsp").forward(request, response);
		
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.checkConnect(request, response);
		
		// on récupère les informations envoyées en post
		String titre = request.getParameter("titre").toUpperCase();
		long auteurid = Integer.parseInt(request.getParameter("auteurId"));
		
		String annee = request.getParameter("annee");
		
		String message = "";
		boolean insertOk = false;
		
		// initialisation de la DB
		this.listeAuteurs = Init.initDBAuteur(listeAuteurs, auteurManager);
		this.listeLivres = Init.initDBLivre(listeLivres, livreManager);
		
		try {
			// création d'un livre temporaire
			Livre livre = new Livre(titre, annee);
			// récupération du max de l'id pour l'insertion faire id+1
			long maxId = Long.parseLong(auteurManager.getMaxId().get(0)+"");
			
			Auteur auteur;

			// si auteurId reçu est -1 alors new Auteur 
			if(auteurid == -1){
				String nom_auteur = new String(request.getParameter("nom_auteur").toUpperCase().getBytes(), "UTF-8");
				String prenom_auteur = new String(request.getParameter("prenom_auteur").toUpperCase().getBytes(), "UTF-8");
				auteur = new Auteur(maxId+1, nom_auteur, prenom_auteur);
				auteurManager.addObject(auteur);
			} else {
				auteur = auteurManager.getEntityManager().find(Auteur.class, auteurid); 
			}

			// lien entre livre et auteur
			livre.getAuteur().add(auteur);
			livreManager.addObject(livre);
			message = "Insertion OK";
			insertOk = true;
		} catch (Exception e) {
			message = "Insertion Failed";
		}
		
		request.setAttribute("listeLivres", listeLivres);
		request.setAttribute("listeAuteurs", listeAuteurs);
		request.setAttribute("message", message);
		request.setAttribute("insertOk", insertOk);
		this.getServletContext().getRequestDispatcher("/WEB-INF/init.jsp")
				.forward(request, response);
	}

	// check si l'utilisateur est bien connecté, sinon retour sur la page d'inscription
	public void checkConnect(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		HttpSession session = request.getSession();
		if(session.getAttribute("username") == null){
			this.getServletContext().getRequestDispatcher("/WEB-INF/connexion.jsp").forward(request, response);
		}
	}
	
	public static List<Livre> initDBLivre (List<Livre> listeLivres, LivreManager livreManager){
		// on cherche s'il y a des livres de présent dans la bdd
		listeLivres = livreManager.findAll();

		// initialisation de la base donnée si aucun livre présent
		if(listeLivres.isEmpty()) {
			livreManager.init();
		}

		listeLivres = livreManager.findAll();
		return listeLivres;
	}
	
	public static List<Auteur> initDBAuteur (List<Auteur> listeAuteurs, AuteurManager auteurManager){
		listeAuteurs = auteurManager.findAll();

		// initialisation de la base donnée si aucun auteur présent
		if(listeAuteurs.isEmpty()) {
			auteurManager.init();
		}

		listeAuteurs = auteurManager.findAll();
		return listeAuteurs;
	}
}
